package utils

import (
	"crypto/hmac"
	"crypto/sha256"
	//"encoding/hex"
	"fmt"
	"os"
)

const (
	defaultLen = 16
	algorithm  = "HmacSHA256"
)

var (
	digits   = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}
	keyBytes = []byte{115, 117, 112, 101}
)

// GetInstitutionCode 输出定长的单向加密结果
func GetInstitutionCode(data string) string {
	return EncryptWithLength(data, defaultLen)
}

// EncryptWithLength 单向加密，指定输出长度
func EncryptWithLength(data string, length int) string {
	mac := hmac.New(sha256.New, keyBytes)
	_, err := mac.Write([]byte(data))
	if err != nil {
		fmt.Fprintf(os.Stderr, "Encryption failed: %v\n", err)
		return ""
	}
	cipher := mac.Sum(nil)

	var result []byte
	for _, b := range cipher {
		result = append(result, toHex(b, true)...)
	}

	if len(result) > length {
		return string(result[:length])
	}

	return string(result)
}

// toHex 将单个字节转换为十六进制字符串
func toHex(b byte, dcb bool) []byte {
	var ob []byte
	i1 := (b >> 4) & 0x0F
	i2 := b & 0x0F

	if dcb {
		i1 = byte(dcbFunc(int(i1)))
		i2 = byte(dcbFunc(int(i2)))
	}

	ob = append(ob, digits[i1])
	ob = append(ob, digits[i2])

	return ob
}

// dcbFunc 根据条件调整数字
func dcbFunc(i int) int {
	if i > 9 {
		i -= 9
	}
	return i
}

//func main() {
//	// 生成驾培机构通信编号（根据驾培机构统一社会信用代码）
//	inscode := EncryptResult("202509020002SDWZJX")
//	fmt.Println("驾培机构通信编号:", inscode)
//
//	// 生成教练员通信编号（根据身份证号）
//	coachnum := EncryptResult("360782198105212679")
//	fmt.Println("教练员通信编号:", coachnum)
//
//	// 生成教练车通信编号（根据车牌号码）
//	carnum := EncryptResult("赣H2629学")
//	fmt.Println("教练车通信编号:", carnum)
//
//	// 生成学员通信编号（根据学员身份证号和培训车型）
//	stunum := EncryptResult("360782199209192341" + "C1")
//	fmt.Println("学员通信编号:", stunum)
//}
